package jxtsyncmap

import (
	"sync"
)

type SyncMap[K comparable, V any] struct {
	sync.Map
}

func NewMap[K comparable, V any]() *SyncMap[K, V] {
	return new(SyncMap[K, V])
}

// Store 存储键值对（类型安全）[[5]][[7]]
func (m *SyncMap[K, V]) Store(key K, value V) {
	m.Map.Store(key, value)
}

// Load 读取键值对（返回零值和布尔值）[[5]][[6]]
func (m *SyncMap[K, V]) Load(key K) (V, bool) {
	v, ok := m.Map.Load(key)
	if !ok {
		var zero V
		return zero, false
	}
	return v.(V), true
}

// LoadOrStore 若存在则返回现有值，否则存储新值 [[9]]
func (m *SyncMap[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
	v, ok := m.Map.LoadOrStore(key, value)
	return v.(V), ok
}

// Delete 删除指定键 [[8]]
func (m *SyncMap[K, V]) Delete(key K) {
	m.Map.Delete(key)
}

// Range 遍历所有键值对（支持并发安全）[[10]]
func (m *SyncMap[K, V]) Range(f func(key K, value V) bool) {
	m.Map.Range(func(k, v any) bool {
		return f(k.(K), v.(V)) // 类型断言确保安全性 [[6]]
	})
}

// Swap 替换指定键的值并返回旧值 [[4]][[5]]
func (m *SyncMap[K, V]) Swap(key K, newValue V) (oldValue V, swapped bool) {
	v, ok := m.Map.Swap(key, newValue)
	if !ok {
		var zero V
		return zero, false
	}
	return v.(V), true
}

// CompareAndSwap 比较并交换（Go 1.20+）[[4]]
func (m *SyncMap[K, V]) CompareAndSwap(key K, old, new V) bool {
	return m.Map.CompareAndSwap(key, old, new)
}

// Clear 清空所有键值对（Go 1.20+）[[4]]
func (m *SyncMap[K, V]) Clear() {
	m.Map.Clear()
}

// Len 返回当前存储的键值对数量（注意：遍历统计可能影响性能）
func (m *SyncMap[K, V]) Len() int {
	count := 0
	m.Map.Range(func(_ any, _ any) bool { // 忽略键值参数
		count++
		return true // 继续遍历
	})
	return count
}
